10 DAC 模拟电压实验

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
DAC 模拟电压实验
本章目标:
- 了解 DAC 基本概念和 RA6M5 处理器的 DAC 外设;
- 学会使用 RASC 配置 DAC 输出指定电压和正弦波形;
硬件设计
本实验使用开发板的 DAC 模块,通过 DAC 通道输出模拟电压信号,可使用示波器观察波形。
软件设计
新建工程
复制一份“09 ADC”修改文件夹名“10 DAC”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 dac.c 和 dac.h,保存到目录下的 \src 文件夹下。
FSP 配置
在 RASC 中配置 DAC 时,先配置 DAC 的通道的引脚,再去添加 DAC 的 Stack 模块并进行配置。
Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。
首先配置 DAC 通道。

在 RASC 的“Pins”中的“Peripherals”选择“Analog:DAC”,选择 DAC 通道 DAC0 在右侧配置中将“Operation Mode”设置为“Enabled”,引脚只有一个 P014。如果是 DAC1,引脚是 P015。
配置 DAC Stack 模块,在 FSP 的“Stacks”界面点击“New Stack”,选择“Analog”中的“DAC(r_dac)”。

打开 DAC Stack 属性界面,配置 DAC0 参数,这些属性基本都不需要配置,按照默认值即可。

| DAC属性 | 描述 |
|---|---|
| Name | 模块实例名,默认设置为“g_dac0”即可 |
| Channel | 通道。选择通道 0 |
| Synchronize with ADC | 与 ADC 同步 |
| Date Format | 数据格式:右对齐/左对齐 |
| Output Amplifer | 使能 DAC 输出放大器 |
| Charge Pump (Requires MOCO active) | 使能 DAC 充电泵 |
| Internal Output | 内部输出 |
| ELC Trigger Source | 选择 ELC 触发源 |
| Pins > DA0 | 选择 P014 引脚 |
配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击 “Generate Project Content” 按钮,让软件自动生成配置代码即可。
- 引脚配置信息
引脚配置在 pin_data.c 文件里生成。
const ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {
{
.pin = BSP_IO_PORT_00_PIN_14,
.pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)
},
}
将 P014 复用为 IOPORT_CFG_ANALOG_ENABLE,也就是使能了 P014 的模拟量输入功能。
- DAC配置信息
DAC 设备对象会在 hal_data.c 中生成,是 dac_cfg_t 类型的结构体常量,名为 g_dac0_cfg。
const dac_cfg_t g_dac0_cfg =
{
.channel = 0,
.ad_da_synchronized = false,
.p_extend = &g_dac0_ext_cfg
};
channel:DAC 通道
ad_da_synchronized:是否和 ADC 同步转换
p_extend:扩展的配置信息
g_dac0_ext_cfg,它被用来描述 DAC 的扩展配置参数,比如是否使用放大器、数据存放格式、是否使能内部输出等。
const adc_extended_cfg_t g_adc0_cfg_extend =
{
.add_average_count = ADC_ADD_OFF,
.clearing = ADC_CLEAR_AFTER_READ_ON,
.trigger = ADC_START_SOURCE_DISABLED,
.trigger_group_b = ADC_START_SOURCE_DISABLED,
.double_trigger_mode = ADC_DOUBLE_TRIGGER_DISABLED,
.adc_vref_control = ADC_VREF_CONTROL_VREFH,
.enable_adbuf = 0,
...
}
程序设计
实现 DAC0 通道输出模拟电压值,通过生成的正弦波数据数组,在循环中实现输出正弦波电压信号,在示波器查看正弦波波形。
- 打开 DAC 设备
R_DAC_Open(dac_ctrl_t * const p_ctrl, dac_cfg_t const * const p_cfg);
- 开启转换
R_DAC_Start(dac_ctrl_t * const p_ctrl);
- 设置转换值
R_DAC_Write(dac_ctrl_t * const p_ctrl, uint16_t value);
此函数会将 value 写入到 DAC 的 DADR 寄存器中,如果开启了 DAC 转换,会立刻进行 DAC 转换,并把模拟信号输出到 DAC 引脚上。
- 停止转换
R_DAC_Stop(dac_ctrl_t * const p_ctrl);
- 换算转换值
dac_data = (uint16_t)(4095*((voltage)/3.3f));
DAC 量程 04095,对应电压 03.3V,设置电压值需要换算成 DAC 值。
程序编写
在 dac.h 头文件里定义初始化函数,设置转换值函数,正弦波生成函数。
#ifndef _BSP_DAC_H_
#define _BSP_DAC_H_
#include "hal_data.h"
void dac_Init();
void dac_SetVoltage(float voltage);
void dac_SinWave_Cycle(uint32_t time_interval);
#endif
在 dac.c 里实现初始化函数、设置转换值函数,正弦波生成函数。
#include "dac.h"
//正弦波数据数组变量
uint16_t var[] = {
2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072, 4093, 4031, 3887, 3668,
3382, 3042, 2661, 2255, 1841, 1435, 1054, 714, 428, 209, 65, 3, 24, 127,
310, 564, 878, 1240, 1636, 2048
};
//初始化DAC
void dac_Init()
{
R_DAC_Open(&g_dac0_ctrl, &g_dac0_cfg);
R_DAC_Start(&g_dac0_ctrl);
}
//设置当前的电压
void dac_SetVoltage(float voltage)
{
uint16_t dac_data;
dac_data = (uint16_t)(4095*((voltage)/3.3f));
R_DAC_Write(&g_dac0_ctrl, dac_data);
}
//生成正弦波波形
void dac_SinWave_Cycle(uint32_t time_interval)
{
for(uint32_t i = 0 ; i < (sizeof(var)/sizeof(var[0])); i++)
{
R_DAC_Write(&g_dac0_ctrl, var[i]);
R_BSP_SoftwareDelay(time_interval, BSP_DELAY_UNITS_MILLISECONDS);
}
}
在 hal_entry.c 文件中添加头文件 dac.h,在 hal_entry 入口函数初始化 dac,在循环中执行正弦波生成函数。
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init(); // LED 初始化
uart0_Init();
dac_Init();
printf("start DAC test\r\n");
while(1)
{
//生成正弦波波形
dac_SinWave_Cycle(1);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
首先使用示波器探头连接 P014 引脚和开发板的 GND 引脚。
连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完。
按下示波器“AUTO”键自动检测波形,可以看到示波器有正弦波形。
